package tp.tecnicasdisenio.dao.impl.jdbc;

import java.io.File;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import tp.tecnicasdisenio.dao.DaoException;
import tp.tecnicasdisenio.dao.EntregaTpDaoInterface;
import tp.tecnicasdisenio.model.entity.Cuatrimestre;
import tp.tecnicasdisenio.model.entity.EntregaTp;
import tp.tecnicasdisenio.model.entity.EntregaTp.ClaveEntregaTp;
import tp.tecnicasdisenio.model.entity.Grupo;
import tp.tecnicasdisenio.model.entity.Grupo.ClaveGrupo;
import tp.tecnicasdisenio.util.EntityUtil;
import tp.tecnicasdisenio.util.FileUtil;
import tp.tecnicasdisenio.util.LectorPropiedades;

public class EntregaTpDao extends DaoAbstract implements EntregaTpDaoInterface{

	private static EntregaTpDao instancia = null;
	
	private String nombreTabla = "entregas";
	
	private EntregaTpDao(){}
	
	public static EntregaTpDao getInstance(){
		if (instancia == null)
			instancia = new EntregaTpDao();
		return instancia;
	}
	
	private ArrayList<EntregaTp> obtenerEntregaTp(ClaveEntregaTp id, boolean unoSolo) {
		ArrayList<EntregaTp> resultado = null;
		
		try {
			String queryString = "SELECT * FROM " + this.nombreTabla;
			
			if (unoSolo)
				queryString = queryString.concat(" WHERE anio=? AND codigo_materia=? AND cuatrimestre=? AND " +
						"nro_grupo=? AND nro_tp=? AND fecha=?");

			connection = this.getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			
			if (unoSolo) {
				preparedStatement.setInt(1, id.getGrupo().getClaveGrupo().getCuatrimestre().getAnio());
				preparedStatement.setString(2, id.getGrupo().getClaveGrupo().getMateria().getCodigo());
				preparedStatement.setInt(3, new Integer(id.getGrupo().getClaveGrupo().getCuatrimestre().getCuatrimestre()));
				preparedStatement.setInt(4, id.getGrupo().getClaveGrupo().getNumero());
				preparedStatement.setInt(5, id.getNroTp());
				preparedStatement.setTimestamp(6, (new Timestamp(id.getFecha().getTime())));
			}
			
			resultSet = preparedStatement.executeQuery();
			
			resultado = new ArrayList<EntregaTp>();
			
			EntregaTp entregaDB = null;
			Grupo grupo = null;
			ClaveGrupo claveGrupo = null;
			Cuatrimestre cuat = null;
			String cuatrimestreDB = null;
			ClaveEntregaTp claveEntrega= null;
			
			while (resultSet.next()) {
				cuatrimestreDB = ((Integer)resultSet.getInt("cuatrimestre")).toString();
				cuat = EntityUtil.crearCuatrimestre(cuatrimestreDB, resultSet.getInt("anio"));
				
				claveGrupo = new ClaveGrupo();
				claveGrupo.setCuatrimestre(cuat);
				claveGrupo.setMateria(MateriaDao.getInstance().getPorId(resultSet.getString("codigo_materia")));
				claveGrupo.setNumero(resultSet.getInt("nro_Grupo"));
				
				grupo = new Grupo();
				grupo.setClaveGrupo(claveGrupo);
				
				claveEntrega = new ClaveEntregaTp();
				
				claveEntrega.setGrupo(grupo);
				claveEntrega.setNroTp(resultSet.getInt("nro_tp"));
				claveEntrega.setFecha(new Date(resultSet.getTimestamp("fecha").getTime()));
				
				entregaDB = new EntregaTp();
				entregaDB.setClaveEntrega(claveEntrega);
				
				resultado.add(entregaDB);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return resultado;
	}
	
	@Override
	public EntregaTp getPorId(ClaveEntregaTp id) {
		ArrayList<EntregaTp> listaEntregas = this.obtenerEntregaTp(id, true); 
		EntregaTp entregaDB = null;
		if (!listaEntregas.isEmpty())
			entregaDB = listaEntregas.iterator().next();
		return entregaDB;
	}

	@Override
	public ArrayList<EntregaTp> obtenerTodos() {
		return (this.obtenerEntregaTp(null, false));
	}

	@Override
	public void borrar(EntregaTp entidad) {
		try {
			String queryString = "DELETE FROM " + this.nombreTabla + " WHERE nro_grupo=? AND nro_tp=? " +
					"AND codigo_materia=? AND cuatrimestre=? AND anio=? AND fecha=?";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setInt(1, entidad.getClaveEntrega().getGrupo().getClaveGrupo().getNumero());
			preparedStatement.setInt(2, entidad.getClaveEntrega().getNroTp());
			preparedStatement.setString(3, entidad.getClaveEntrega().getGrupo().getClaveGrupo().getMateria().getCodigo());
			preparedStatement.setInt(4, new Integer(entidad.getClaveEntrega().getGrupo().getClaveGrupo().getCuatrimestre().getCuatrimestre()));
			preparedStatement.setInt(5, entidad.getClaveEntrega().getGrupo().getClaveGrupo().getCuatrimestre().getAnio());
			preparedStatement.setTimestamp(6, (new Timestamp(entidad.getClaveEntrega().getFecha().getTime())));
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void actualizar(EntregaTp entidad) {
		throw (new RuntimeException("no soportado"));
	}

	@Override
	public void insertar(EntregaTp entidad) {
		try {
			String queryString = "INSERT INTO " + this.nombreTabla + "(nro_grupo, nro_tp, codigo_materia, " +
					"cuatrimestre, anio, fecha) VALUES(?,?,?,?,?,?)";
			connection = getConnection();
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setInt(1, entidad.getClaveEntrega().getGrupo().getClaveGrupo().getNumero());
			preparedStatement.setInt(2, entidad.getClaveEntrega().getNroTp());
			preparedStatement.setString(3, entidad.getClaveEntrega().getGrupo().getClaveGrupo().getMateria().getCodigo());
			preparedStatement.setInt(4, new Integer(entidad.getClaveEntrega().getGrupo().getClaveGrupo().getCuatrimestre().getCuatrimestre()));
			preparedStatement.setInt(5, entidad.getClaveEntrega().getGrupo().getClaveGrupo().getCuatrimestre().getAnio());
			preparedStatement.setTimestamp(6, (new Timestamp(entidad.getClaveEntrega().getFecha().getTime())));
						
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw (new DaoException(e));
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
				if (connection != null)
					connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@SuppressWarnings("deprecation")
	@Override
	public void guardarAdjuntos(List<File> adjuntos, EntregaTp entrega) {
		
		ArrayList<String> carpetasDestino = new ArrayList<String>();
		carpetasDestino.add(LectorPropiedades.getInstance().getPropiedad(LectorPropiedades.RUTA_ENTREGAS_TP));
		carpetasDestino.add(entrega.getClaveEntrega().getGrupo().getClaveGrupo().getMateria().getCodigo());
		carpetasDestino.add(entrega.getClaveEntrega().getGrupo().getClaveGrupo().getCuatrimestre().getAnio().toString());
		carpetasDestino.add("cuat" + entrega.getClaveEntrega().getGrupo().getClaveGrupo().getCuatrimestre().getCuatrimestre());
		carpetasDestino.add("grupo " + entrega.getClaveEntrega().getGrupo().getClaveGrupo().getNumero());
		carpetasDestino.add("tp" + entrega.getClaveEntrega().getNroTp());
		carpetasDestino.add(entrega.getClaveEntrega().getFecha().toLocaleString().replace("/", "-").replace(":", "_"));
		
		String ruta = FileUtil.armarRuta(carpetasDestino);
		//System.out.println(ruta);
		
		ArrayList<File> lista = (ArrayList<File>) adjuntos;
				
		for (Iterator<File> it = lista.iterator(); it.hasNext(); )
			FileUtil.copiarArchivoEnDirectorio(it.next(), ruta);
	}

}
